package ar.edu.utn.frsf.tpae.a2012.g01.service.implementacion;

import java.util.Calendar;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import ar.edu.utn.frsf.tpae.a2012.g01.dao.CuentaDao;
import ar.edu.utn.frsf.tpae.a2012.g01.dao.MovimientoDao;
import ar.edu.utn.frsf.tpae.a2012.g01.model.Cuenta;
import ar.edu.utn.frsf.tpae.a2012.g01.model.Movimiento;
import ar.edu.utn.frsf.tpae.a2012.g01.service.MovimientoService;

public class MovimientoServiceImpl implements MovimientoService {

	private MovimientoDao movimientoDao;
	private CuentaDao cuentaDao;

	// Setter utilizado por Spring.
	@Autowired(required = true)
	public void setMovimientoDao(MovimientoDao movimientoDao) {
		this.movimientoDao = movimientoDao;
	}

	@Autowired(required = true)
	public void setCuentaDao(CuentaDao cuentaDao) {
		this.cuentaDao = cuentaDao;
	}

	@Override
	public void crear(List<Movimiento> movimientos) throws Exception {
		Calendar cal = Calendar.getInstance();
		for (Movimiento movimiento : movimientos) {
			if (movimiento.getFecha().before(cal.getTime())) {
				// persisto el movimiento
				movimientoDao.persistir(movimiento);
				// actualizo saldo de la cuenta
				double saldo = movimiento.getCuenta().getSaldoActual();
				movimiento.getCuenta().setSaldoActual(
						saldo - movimiento.getMonto());
				// persisto la cuenta
				cuentaDao.persistir(movimiento.getCuenta());

			} else
				throw new Exception("El movimiento posee una fecha incorrecta.");
		}
	}

	@Override
	public boolean eliminar(Movimiento movimiento) {
		movimientoDao.eliminar(movimiento);
		return true;
	}

	@Override
	public List<Movimiento> listar() {
		return movimientoDao.listarMovimientos();
	}

	@Override
	public List<Movimiento> getMovimientos(Cuenta cuenta) {
		return movimientoDao.getMovimientosPorCuenta(cuenta);
	}
}
